# 引入数据包
import pandas as pd  # 导入pandas工具包
import numpy as np  # 导入numpy工具包

# 导入数据并预览
data = pd.read_excel("TOPSIS法资料.xlsx")
# print(data[:5])

# 对数据进行趋同化
# 设置城市名（对应的未命名列'Unnamed:0'）为索引
data.set_index(['Unnamed: 0'], inplace=True)
# 获取列名称
n = list(data.columns)
# print(n)


# 定义正向化的函数
def positivization(x, typ):
    # x：需要正向化处理的指标对应的原始向量
    # typ：指标类型（1：极小型，2：中间型，3：区间型）
    if typ == 1:  # 极小型
        new_colum = np.max(x)-x
        return new_colum
    elif typ == 2:  # 中间型
        best = int(input("请输入最佳值："))
        m = np.max(abs(x-best))
        new_colum = 1-abs(x-best)/m
        return new_colum
    elif typ == 3:  # 区间型
        a, b = [int(i) for i in input("按顺序输入最佳区间的左右界，并用逗号隔开：").split(",")]
        m = np.max((np.append(a-np.min(x), np.max(x)-b)))
        x_row = len(x)  # 获取x的行数
        posit_x = np.zeros((x_row, 1), dtype=float)
        for r in range(x_row):
            if x[r] < a:
               posit_x[r] = 1-(a-x[r])/m
            elif x[r] > b:
               posit_x[r] = 1-(x[r]-b)/m
            else:
               posit_x[r] = 1
        print(posit_x.reshape(x_row))
        return posit_x.reshape(x_row)


"""
到这一步，调用正向化函数分别处理每一列数据
"""

# 进行归一化
for i in n:
    x = np.power(np.sum(np.power(data[i],2)),0.5)
    data[i] = data[i]/x

print(data[:5])

A1 = []
# 获取最优列值
for i in n:
    Max = np.max(data[i])
    A1.append(Max)
# 转换形式
A1 = np.array(A1)

# 获取最劣列值
A2 = []
for i in n:
    Min = np.min(data[i])
    A2.append(Min)
# 转换形式
A2 = np.array(A2)

print(A1, A2)

# 计算最优方案
D1 = []
for i in range(1,len(data)+1):
    d1 = np.power(np.sum(np.power(A1 - data[i-1:i],2).values),0.5)
    D1.append(d1)
# 转换形式
D1 = np.array(D1)

# 计算最劣方案
D2 = []
for i in range(1,len(data)+1):
    d2 = np.power(np.sum(np.power(A2 - data[i-1:i],2).values),0.5)
    D2.append(d2)
# 转换形式
D2 = np.array(D2)

print(D1, D2)

# 计算评价对象与最优方案接近程度
C = D2/(D1 + D2)

# 进行排序
# 新建数据框
data1 = pd.DataFrame(C, index = list(data.index))
data2 = pd.DataFrame(D1, index = list(data.index))
data3 = pd.DataFrame(D2, index = list(data.index))

# 按C值进行排序
data1['rank'] = data1.rank(ascending = False)
data2['rank1'] = data2.rank(ascending = False)
data3['rank2'] = data3.rank(ascending = False)

# 对 data1 重新设置列名
data1.columns = ['得分', '排名']

data1['最优方案距离'] = data2[0]
data1['排名1'] = data2['rank1']

data1['最劣方案距离'] = data3[0]
data1['排名2'] = data3['rank2']
print(data1)
